﻿#define  _CRT_SECURE_NO_WARNINGS 1
//1. 螺旋矩阵的打印
//题目：输入一个正整数 n，
//打印一个 n×n 的螺旋矩阵（从 1 开始顺时针螺旋填充）。
//示例：n = 3 时，输出：
//1  2  3
//8  9  4
//7  6  5
#include <stdio.h>
#include <stdlib.h>

// 打印螺旋矩阵
//void printSpiralMatrix(int n) {
//    // 动态分配n×n的矩阵
//    int** matrix = (int**)malloc(n * sizeof(int*));
//    for (int i = 0; i < n; i++) {
//        matrix[i] = (int*)malloc(n * sizeof(int));
//    }
//
//    int top = 0;         // 上边界
//    int bottom = n - 1;  // 下边界
//    int left = 0;        // 左边界
//    int right = n - 1;   // 右边界
//    int num = 1;         // 要填充的数字
//
//    // 顺时针螺旋填充矩阵
//    while (num <= n * n) {
//        // 从左到右填充上边界
//        for (int i = left; i <= right; i++) {
//            matrix[top][i] = num++;
//        }
//        top++;  // 上边界下移
//
//        // 从上到下填充右边界
//        for (int i = top; i <= bottom; i++) {
//            matrix[i][right] = num++;
//        }
//        right--;  // 右边界左移
//
//        // 如果还有行需要填充，从右到左填充下边界
//        if (top <= bottom) {
//            for (int i = right; i >= left; i--) {
//                matrix[bottom][i] = num++;
//            }
//            bottom--;  // 下边界上移
//        }
//
//        // 如果还有列需要填充，从下到上填充左边界
//        if (left <= right) {
//            for (int i = bottom; i >= top; i--) {
//                matrix[i][left] = num++;
//            }
//            left++;  // 左边界右移
//        }
//    }
//
//    // 打印矩阵，每个数字占4个字符位置，右对齐
//    for (int i = 0; i < n; i++) {
//        for (int j = 0; j < n; j++) {
//            printf("%4d", matrix[i][j]);
//        }
//        printf("\n");
//    }
//
//    // 释放动态分配的内存
//    for (int i = 0; i < n; i++) {
//        free(matrix[i]);
//    }
//    free(matrix);
//}
//
//int main() {
//    int n;
//    printf("请输入正整数n: ");
//    scanf("%d", &n);
//
//    // 检查输入是否为正整数
//    if (n <= 0) {
//        printf("请输入正整数！\n");
//        return 1;
//    }
//
//    printSpiralMatrix(n);
//
//    return 0;
//}



//2. 数组中“山峰”的统计
//题目：定义一个整数数组（长度≥3），
//一个“山峰”是指该元素大于其左右相邻元素（数组首尾元素不能为山峰）。
//统计数组中所有山峰的数量，并输出每个山峰的值和下标。
//示例：数组[1, 3, 2, 5, 4, 6, 5]中，3（下标 1）、5（下标 3）、6（下标 5）是山峰，输出数量为 3。
//void countPeaks(int arr[], int length)
//{
//	int peakCount = 0;  // 山峰数量
//	printf("数组中的山峰有: \n");
//	// 遍历数组，首尾元素不能是山峰
//	for (int i = 1; i < length - 1; i++)
//	{
//		if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
//		{
//			peakCount++;
//			printf("值：%d(下标:%d)\n",arr[i],i);
//		}
//	}
//	printf("山峰的总数量是:%d\n", peakCount);
//}
//int main()
//{
//	int arr[6] = { 0 };
//	printf("请你输入6个整数: ");
//	for (int i = 0; i < 6; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	int length = sizeof(arr) / sizeof(arr[0]);  // 计算数组长度
//	if (length < 3)
//	{
//		printf("数组长度必须大于等于3！\n");
//		return 1; // 不符合要求，程序退出
//	}
//	// 调用函数统计山峰
//	countPeaks(arr, length);
//	return 0;
//}


//3. 字符串的最长公共前缀
//题目：输入若干个字符串（以空字符串结束输入），
//找出这些字符串的最长公共前缀。若不存在公共前缀（如输入 "abc" 和 "def"），
//则输出空字符串。
//示例：输入 "flower"、"flow"、"flight"，输出 "fl"。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 比较多个字符串，找出最长公共前缀
//char* longestCommonPrefix(char** strs, int strsSize) {
//    // 如果没有输入字符串，返回空字符串
//    if (strsSize == 0) {
//        return _strdup("");
//    }
//
//    // 以第一个字符串为基准，逐个字符比较
//    for (int i = 0; i < strlen(strs[0]); i++) {
//        char c = strs[0][i];  // 取基准字符串的第i个字符
//        // 与其他所有字符串的第i个字符比较
//        for (int j = 1; j < strsSize; j++) {
//            // 若某字符串长度不足i+1，或字符不匹配，则截断前缀
//            if (i >= strlen(strs[j]) || strs[j][i] != c) {
//                char* prefix = (char*)malloc(i + 1);
//                strncpy(prefix, strs[0], i);
//                prefix[i] = '\0';  // 手动添加字符串结束符
//                return prefix;
//            }
//        }
//    }
//
//    // 所有字符串都匹配第一个字符串的全部内容
//    return _strdup(strs[0]);
//}
//
//int main() {
//    char buffer[100];  // 用于存储输入的单个字符串
//    char* strs[100];   // 存储所有输入的字符串（最多100个）
//    int count = 0;     // 记录输入的字符串数量
//
//    printf("请输入字符串（输入空字符串结束）：\n");
//
//    // 循环读取字符串，直到输入空字符串
//    while (1) {
//        // 读取一行输入
//        if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
//            break;  // 读取失败，退出循环
//        }
//
//        // 去除输入中的换行符（fgets会保留换行符）
//        buffer[strcspn(buffer, "\n")] = '\0';
//
//        // 若输入空字符串，则结束输入
//        if (strlen(buffer) == 0) {
//            break;
//        }
//
//        // 保存输入的字符串（复制到动态内存）
//        strs[count] = _strdup(buffer);
//        count++;
//
//        // 防止数组越界（最多存储100个字符串）
//        if (count >= 100) {
//            printf("已达到最大输入数量（100个），自动结束输入\n");
//            break;
//        }
//    }
//
//    // 计算最长公共前缀
//    char* result = longestCommonPrefix(strs, count);
//
//    // 输出结果
//    printf("最长公共前缀为：\"%s\"\n", result);
//
//    // 释放动态分配的内存
//    for (int i = 0; i < count; i++) {
//        free(strs[i]);
//    }
//    free(result);
//
//    return 0;
//}
